package cn.lg.soar.core.sn;

public interface SnManager {

	/**
	 * 生成编号
	 * 示例1：const('SXC');yyyyMMdd;dbSerial(4,$prefix,86400000)
	 * 示例2：random(3);datetime('yyyyMMddHHmmss');redisSerial(4,$prefix,86400000)
	 * 示例3：random($args[0]);datetime('yyyyMMddHHmmss');redisSerial(4,$prefix,86400000)
	 * 现有内置规则：
	 *     year: 获取当前年份，无参，示例：year
	 *     month: 获取当前月份，无参，示例：month
	 *     day: 获取当前日期，无参，示例：day
	 *     hour: 获取当前小时，无参，示例：hour
	 *     minute: 获取当前分钟，无参，示例：minute
	 *     second: 获取当前秒钟，无参，示例：second
	 *     yyyyMM: 获取当前时间格式化为yyyyMM，无参，示例：yyyyMM
	 *     yyyyMMdd: 获取当前时间格式化为yyyyMMdd，无参，示例：yyyyMMdd
	 *     yyyyMMddHH: 获取当前时间格式化为yyyyMMddHH，无参，示例：yyyyMMddHH
	 *     yyyyMMddHHmm: 获取当前时间格式化为yyyyMMddHHmm，无参，示例：yyyyMMddHHmm
	 *     yyyyMMddHHmmss: 获取当前时间格式化为yyyyMMddHHmmss，无参，示例：yyyyMMddHHmmss
	 *     datetime(fmt): 获取当前时间，支持自定义格式
	 *     		fmt：格式，默认：yyyyMMddHHmmss
	 *     	示例：datetime 或 datetime('yyyyMMdd')
	 *     random(len, source): 生成一个随机字符串，
	 *     		len：要生成的字符数
	 *     		source：字符源，默认：ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
	 *     	示例：random(4) 或 random(2,'1234567890')
	 *     number(len): 生成一个随机数值，
	 *     		len：要生成的位数
	 *     	示例：number(5)
	 *     const(val): 返回一个固定值
	 *     		val：要返回的字符
	 *     	示例：const('ORDER')
	 *     redisSerial(len, key, expire): 基于redis的流水号生成
	 *     		len：流水号长度
	 *     		key：redis key
	 *     		expire：redis 有效期(毫秒)
	 *     	示例：redisSerial(4, $prefix, 1800000)
	 *     dbSerial(len, key, expire): 基于数据库的流水号生成
	 *     		len：流水号长度
	 *     		key：数据key
	 *     		expire：数据有效期
	 *     	示例：dbSerial(4, $prefix, 1800000)
	 * 特殊符号：
	 * 	$prefix：前缀，获取该规则前面规则生成的字符，必须在规则括号内使用，示例：$prefix
	 * 	$args：获取 generate 方法的 args 值，必须在规则括号内使用，示例：$args[0] 或 $args[2]
	 * @param args
	 * @return
	 */
	String generate(String[] rules, Object...args);

	/**
	 * 生成编号
	 * 示例1：const('SXC');yyyyMMdd;dbSerial(4,$prefix,86400000)
	 * 示例2：random(3);datetime('yyyyMMddHHmmss');redisSerial(4,$prefix,86400000)
	 * 示例3：random($args[0]);datetime('yyyyMMddHHmmss');redisSerial(4,$prefix,86400000)
	 * 现有内置规则：
	 *     year: 获取当前年份，无参，示例：year
	 *     month: 获取当前月份，无参，示例：month
	 *     day: 获取当前日期，无参，示例：day
	 *     hour: 获取当前小时，无参，示例：hour
	 *     minute: 获取当前分钟，无参，示例：minute
	 *     second: 获取当前秒钟，无参，示例：second
	 *     yyyyMM: 获取当前时间格式化为yyyyMM，无参，示例：yyyyMM
	 *     yyyyMMdd: 获取当前时间格式化为yyyyMMdd，无参，示例：yyyyMMdd
	 *     yyyyMMddHH: 获取当前时间格式化为yyyyMMddHH，无参，示例：yyyyMMddHH
	 *     yyyyMMddHHmm: 获取当前时间格式化为yyyyMMddHHmm，无参，示例：yyyyMMddHHmm
	 *     yyyyMMddHHmmss: 获取当前时间格式化为yyyyMMddHHmmss，无参，示例：yyyyMMddHHmmss
	 *     datetime(fmt): 获取当前时间，支持自定义格式
	 *     		fmt：格式，默认：yyyyMMddHHmmss
	 *     	示例：datetime 或 datetime('yyyyMMdd')
	 *     random(len, source): 生成一个随机字符串，
	 *     		len：要生成的字符数
	 *     		source：字符源，默认：ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
	 *     	示例：random(4) 或 random(2,'1234567890')
	 *     number(len): 生成一个随机数值，
	 *     		len：要生成的位数
	 *     	示例：number(5)
	 *     const(val): 返回一个固定值
	 *     		val：要返回的字符
	 *     	示例：const('ORDER')
	 *     redisSerial(len, key, expire): 基于redis的流水号生成
	 *     		len：流水号长度
	 *     		key：redis key
	 *     		expire：redis 有效期(毫秒)
	 *     	示例：redisSerial(4, $prefix, 1800000)
	 *     dbSerial(len, key, expire): 基于数据库的流水号生成
	 *     		len：流水号长度
	 *     		key：数据key
	 *     		expire：数据有效期
	 *     	示例：dbSerial(4, $prefix, 1800000)
	 * 特殊符号：
	 * 	$prefix：前缀，获取该规则前面规则生成的字符，必须在规则括号内使用，示例：$prefix
	 * 	$args：获取 generate 方法的 args 值，必须在规则括号内使用，示例：$args[0] 或 $args[2]
	 * @param args
	 * @return
	 */
	default String generate(String rules, Object...args) {
		return generate(rules.split(";"), args);
	}

}
